Semantik Web • Hafta 03
RDF & RDFS
Üçlü modeli, graf düşünme, Turtle sözdizimi ve alerji sözlüğünün kurulması
Lisansüstü Semantik Web Dersi • CMPE 583
Hafta 03 • Kazanımlar
Bu hafta sonunda
- Alerji verisini üçlülerle modelleyip Turtle ile yazabileceksiniz.
- IRI, literal ve blank node ayrımını doğru yapabileceksiniz.
- RDFS ile sınıf ve özellik hiyerarşisi kurabileceksiniz.
- domain/range'in kısıt değil çıkarım ürettiğini gösterebileceksiniz.
- Temel SPARQL sorgularıyla grafı sorgulayabileceksiniz.
Geçen haftadan hatırlatma
- XML ağaçtır: her düğümün tek ebeveyni vardır.
- Bağlar adsızdır; ref="Nisin" yalnızca bir metindir.
- XPath bildirilmiş veriyi sorgular; risk zincirini kuramaz.
- Bu hafta aynı veriyi graf olarak yeniden kuruyoruz.
01
Ödev 2'nin Çözümü
XML tasarım kararları, şema kısıtları ve hata analizi.
Çözüm 2.1 — Tasarım kararları
| Alan | Karar | Gerekçe |
| ean, tc | Attribute | Kimlik, tekil, yapısı yok |
| name | Element | Alan verisi, uzun olabilir |
| allergy | Element (çoklu) | Bir kişide birden çok olabilir |
| unit | Attribute | Değerin meta bilgisi |
| BMI | Yok | Hesaplanır, saklanmaz |
Çözüm 2.2 — Şema kısıtları
<xs:pattern value="EAN_[0-9]{5}"/>
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
<xs:enumeration value="Lactose"/>
- Barkod: desen — kimlik biçimi sabittir.
- Yaş: aralık — 0–120 dışı veri hatalıdır.
- Alerji: enumeration — kapalı küme, yazım hatası yakalanır.
Çözüm 2.3 — Üç doğrulama hatası
| Satır | Hata | Mesaj |
| count="two" | Tip uyuşmazlığı | not a valid value for 'int' |
| ean="EAN_105" | Desen ihlali | not facet-valid with pattern |
| additive önce, name sonra | Sıra ihlali | Invalid content: 'name' expected |
Sıra hatası yalnızca xs:sequence ile ortaya çıkar; xs:all kullanılsaydı geçerli olurdu.
02
RDF: Veri Modeli
Üçlüler, graf, IRI, literal ve serileştirmeler.
RDF nedir?
- Kaynaklar arasındaki ilişkileri üçlülerle ifade eden bir veri modeli.
- Belge değil graf: sıra yoktur, tekrar yoktur, birleştirme serbesttir.
- Her kaynak bir IRI ile küresel olarak adlandırılır.
- Sözdizimi değil model: Turtle, RDF/XML, JSON-LD aynı grafı yazar.
Üçlü: özne — yüklem — nesne
EAN_00004
Contain──────▶
Nisin
Triggers──────▶
Lactose
| Bileşen | Ne olabilir | Örnek |
| Özne | IRI veya blank node | :EAN_00004 |
| Yüklem | Yalnızca IRI | :Contain |
| Nesne | IRI, blank node veya literal | :Nisin / "Eti Chocolate" |
Üç düğüm türü
IRI
:Nisin
Küresel kimlik; başka grafla birleşir.
Literal
"67.5"^^xsd:double
Veri değeri; özne olamaz.
Blank node
_:b1
Adı olmayan ara düğüm; yereldir.
Alerji grafının bir kesiti
TC_001 ──hasAllergy──▶ Lactose
TC_001 ──ChooseProduct──▶ EAN_00004
EAN_00004 ──Contain──▶ Nisin
Nisin ──Triggers──▶ Lactose
Lactose düğümü iki farklı yoldan işaretlenir. Bu paylaşılan düğüm, riskin çıkarılmasını sağlayan yapıdır; XML ağacında böyle bir paylaşım yoktur.
Aynı üçlü, üç yazım biçimi
Turtle:Nisin :Triggers :Lactose .
N-Triples<http://EMU/AllergyOntology#Nisin> <...#Triggers> <...#Lactose> .
RDF/XML<rdf:Description rdf:about="#Nisin">
<Triggers rdf:resource="#Lactose"/>
</rdf:Description>
Projedeki dosya RDF/XML'dir; derste okumayı kolaylaştırmak için çoğu örneği Turtle ile yazacağız.
Turtle: önek bildirimi
@prefix : <http://EMU/AllergyOntology#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
:Nisin a :FoodAdditives .
a kısayolu rdf:type anlamına gelir. Boş önek (:) projenin kendi namespace'idir.
Turtle kısayolları
Uzun yazım
:EAN_00004 a :Product .
:EAN_00004 :Contain :Nisin .
:EAN_00004 :Contain :Soy_Lecitin .
Kısayollu
:EAN_00004
a :Product ;
:Contain :Nisin , :Soy_Lecitin .
; aynı özneyi sürdürür, , aynı yüklemi sürdürür.
Projeden: ürünler Turtle ile
:EAN_00001
a :Product ;
:hasProductName "ETI Cracker" ;
:Contain :Alginic_Acid .
:EAN_00002
a :Product ;
:hasProductName "Ulker Damak" ;
:Contain :Phospore , :Soy_Lecitin .
:EAN_00003
a :Product ;
:hasProductName "Dardanel Ton" ;
:Contain :Casein , :Sodium_Ascorbite .
:EAN_00004
a :Product ;
:hasProductName "Eti Chocolate" ;
:Contain :Ascorbic_Acid , :Nisin ,
:Soy_Lecitin .
Projeden: katkı maddeleri ve tetikleme
:Nisin a :FoodAdditives ;
:Triggers :Lactose .
:Casein a :FoodAdditives ;
:Triggers :Lactose .
:Soy_Lecitin a :FoodAdditives ;
:Triggers :Egg ;
rdfs:label "Soy Lecithin" .
:Sodium_Ascorbite a :FoodAdditives ;
:Triggers :Fish .
:Alginic_Acid a :FoodAdditives ;
:Triggers :Gluten .
:Ascorbic_Acid a :FoodAdditives .
# tetikleme bilgisi YOK → bilinmiyor
Son satır önemlidir: açık dünyada eksik üçlü "tetiklemez" demek değildir.
Projeden: kişiler Turtle ile
:TC_001
a :Person ;
:hasName "Ayse" ;
:hasAge "38"^^xsd:int ;
:hasWeight "67.5"^^xsd:double ;
:hasHeight "1.68"^^xsd:double ;
:hasAllergy :Lactose ;
:ChooseProduct :EAN_00004 .
:TC_003
a :Person ;
:hasName "MEHMET" ;
:hasAge "35"^^xsd:int ;
:hasWeight "93.0"^^xsd:double ;
:hasHeight "1.87"^^xsd:double ;
:hasAllergy :Fish , :Lactose ;
:ChooseProduct :EAN_00003 .
Literal: tip ve dil etiketi
| Yazım | Anlamı |
| "38"^^xsd:int | Tam sayı — aritmetiğe girer |
| "38" | Metin — S4 kuralında çalışmaz |
| "Riskli Kişi"@tr | Türkçe etiket |
| "Person At Risk"@en | İngilizce etiket |
Projede en sık görülen hata: yaşın tip verilmeden yazılması. swrlb:greaterThanOrEqual built-in'i metinle çalışmaz ve S5 kuralı sessizce hiçbir sonuç üretmez.
Blank node ne zaman kullanılır?
# Miktar bilgisi olan içerik
:EAN_00004 :hasIngredient [
:additive :Nisin ;
:amountMg "12.5"^^xsd:double
] .
- Kimlik vermeye değmeyen ara yapı için.
- OWL kısıtları da blank node olarak yazılır (Hafta 05).
- Dezavantaj: dışarıdan referans verilemez, birleştirmede eşleşmez.
Graf birleştirme: iki kaynak, tek graf
Market kataloğu
:EAN_00004 :Contain :Nisin .
Sağlık kaynağı
:Nisin :Triggers :Lactose .
İki kaynak aynı IRI'yi kullandığı için birleşme kendiliğinden olur; eşleme tablosu, ETL veya JOIN yazmaya gerek yoktur. Bu, RDF'in tek en büyük pratik faydasıdır.
RDF/XML: projedeki dosyanın dili
<owl:NamedIndividual rdf:about="#TC_001">
<rdf:type rdf:resource="#Person"/>
<ChooseProduct rdf:resource="#EAN_00004"/>
<hasAllergy rdf:resource="#Lactose"/>
<hasAge rdf:datatype="&xsd;int">38</hasAge>
<hasName rdf:datatype="&xsd;string">Ayse</hasName>
</owl:NamedIndividual>
| Yapı | Anlamı |
| rdf:about | Öznenin IRI'si |
| rdf:resource | Nesne bir IRI |
| rdf:datatype | Nesne tipli literal |
Adlandırılmış graf: bilgi nereden geldi?
:EAN_00004 :Contain :Nisin <http://EMU/graph/market> .
:Nisin :Triggers :Lactose <http://EMU/graph/health> .
:TC_001 :hasAllergy :Lactose <http://EMU/graph/patient> .
Dördüncü öge kaynağı söyler. Bir gıda güvenliği sisteminde "bu riski hangi kaynak bildirdi?" sorusunun cevabı budur — Hafta 01'deki Proof/Trust katmanının pratik karşılığı.
03
SPARQL ile Sorgulama
Graf desenleri, filtreler ve alerji sorguları.
SPARQL: desen eşleme
PREFIX : <http://EMU/AllergyOntology#>
SELECT ?urun ?ad
WHERE {
?urun a :Product ;
:hasProductName ?ad .
}
ORDER BY ?ad
WHERE bloğu bir graf desenidir: değişkenler grafa oturtulur, her oturum bir satır üretir.
Sorgu 1 — Nisin içeren ürünler
SELECT ?ad WHERE {
?u :Contain :Nisin ;
:hasProductName ?ad .
}
?ad
─────────────────
"Eti Chocolate"
Bu sorgu XPath ile de yazılabilirdi. Farkı bir sonraki slaytta göreceğiz.
Sorgu 2 — Riskli seçimler (zincir)
SELECT ?kisi ?urun ?katki ?alerji WHERE {
?kisi a :Person ;
:hasAllergy ?alerji ;
:ChooseProduct ?urun .
?urun :Contain ?katki .
?katki :Triggers ?alerji .
}
TC_001 EAN_00004 Nisin Lactose
TC_002 EAN_00003 Casein Lactose
TC_003 EAN_00003 Casein Lactose
TC_003 EAN_00003 Sodium_Ascorbite Fish
Aynı desen S6 kuralının gövdesidir. Fark: SPARQL sorar, SWRL yazar — sonuç ontolojide kalıcı olur.
FILTER ve OPTIONAL
Yetişkinler
SELECT ?ad WHERE {
?p :hasName ?ad ;
:hasAge ?y .
FILTER (?y >= 18)
}
Etiketi olmayan katkılar da listelensin
SELECT ?k ?etiket WHERE {
?k a :FoodAdditives .
OPTIONAL { ?k rdfs:label ?etiket }
}
OPTIONAL, açık dünyayla uyumlu çalışmanın yoludur: eksik veri satırı düşürmez.
ASK ve CONSTRUCT
ASK — evet/hayır
ASK {
:TC_001 :ChooseProduct ?u .
?u :Contain :Nisin .
}
# true
CONSTRUCT — yeni üçlü
CONSTRUCT {
?p :Effected_Allergen ?f .
} WHERE {
?p :hasAllergy ?a ;
:ChooseProduct ?u .
?u :Contain ?f . ?f :Triggers ?a .
}
CONSTRUCT, SWRL kuralına en yakın SPARQL yapısıdır; ancak sonucu ayrı bir graf olarak döner, ontolojiye yazmaz.
04
RDFS: Sözlük Katmanı
Sınıflar, hiyerarşi, domain/range ve RDFS çıkarımı.
RDFS ne ekler?
- RDF yalnızca üçlüleri verir; RDFS bu üçlülere sözlük kazandırır.
- Sınıf ve özellik hiyerarşisi tanımlanır.
- Özelliklerin hangi türler arasında geçtiği bildirilir.
- Küçük ama gerçek bir çıkarım kümesi elde edilir.
Sınıflar ve alt sınıflar
:Person a rdfs:Class .
:Adult a rdfs:Class ;
rdfs:subClassOf :Person .
:PersonAtRisk a rdfs:Class ;
rdfs:subClassOf :Person .
Person
├── Adult
└── PersonAtRisk
Çıkarım: :Adult(:TC_001) verilirse :Person(:TC_001) otomatik doğrudur.
Alt özellikler: projedeki alerjen ağacı
:Effected_Allergen a rdf:Property .
:Lactose_Allergen
rdfs:subPropertyOf :Effected_Allergen .
:Egg_Allergen
rdfs:subPropertyOf :Effected_Allergen .
:Fish_Allergen
rdfs:subPropertyOf :Effected_Allergen .
:Gluten_Allergen
rdfs:subPropertyOf :Effected_Allergen .
S2 → :TC_001 :Lactose_Allergen :Casein
çıkarım ⇩
:TC_001 :Effected_Allergen :Casein
S7 kuralı yalnızca üst özelliğe bakar; alt özellikleri yazmak yeterlidir.
domain ve range
:Contain rdfs:domain :Product ;
rdfs:range :FoodAdditives .
:Triggers rdfs:domain :FoodAdditives ;
rdfs:range :Allergy .
:hasAge rdfs:domain :Person ;
rdfs:range xsd:int .
| Bildirim | Okunuşu |
| domain | Bu özelliğin öznesi şu sınıftandır |
| range | Bu özelliğin nesnesi şu sınıftandır |
Dikkat: domain bir kısıt değildir
Verilen
:TC_009 :Contain :Nisin .
Beklenen vs gerçekleşen
Beklenen : hata / uyarı
Gerçek : :TC_009 a :Product
(çıkarıldı!)
Projede Person ve Product ayrık tanımlıdır; işte bu yüzden yukarıdaki durum tutarsızlık olarak yakalanır. Ayrıklık aksiyomu olmasa hata sessizce yanlış çıkarıma dönerdi.
RDFS çıkarım kuralları
| Verilen | Çıkarılan |
| P rdfs:domain C . x P y | x a C |
| P rdfs:range C . x P y | y a C |
| C rdfs:subClassOf D . x a C | x a D |
| P rdfs:subPropertyOf Q . x P y | x Q y |
Dört satır, projedeki çıkarımların önemli bir kısmını üretir — SWRL'e gerek kalmadan.
Çıkarım örneği: dört adım
verili:EAN_00004 :Contain :Nisin .
domain →:EAN_00004 a :Product
range →:Nisin a :FoodAdditives
subProp →:TC_001 :Effected_Allergen :Casein
subClass →:TC_001 a :Person (Adult üzerinden)
Bunların hiçbiri dosyada yazılı değildir; hepsi RDFS düzeyinde üretilir.
Etiket ve açıklama: insan için katman
:PersonAtRisk
rdfs:label "Person At Risk"@en , "Riskli Kişi"@tr ;
rdfs:comment "Seçtiği ürün, alerjisini tetikleyen bir
katkı içeren kişi."@tr .
:Soy_Lecitin rdfs:label "Soya lesitini"@tr , "Soy Lecithin"@en .
Projede bu etiketler hazırdır: arayüz Türkçe, IRI'ler ASCII kalır. Çıkarım bu üçlülerden etkilenmez — yalnızca sunum içindir.
Alerji sözlüğünün tasarımı
| Karar | Seçim | Neden |
| Alerji türleri | Birey | Yeni tür eklemek şema değiştirmesin |
| Katkı maddeleri | Birey | Somut maddeler |
| Alerjen ilişkisi | Alt özellik | Genel + türe özgü sorgulama |
| Riskli kişi | Alt sınıf | Kuralla doldurulur |
RDFS nerede yetmez?
| İhtiyaç | RDFS | Çözüm |
| Person ile Product ayrık olsun | Yok | OWL disjoint |
| Her ürün en az bir katkı içersin | Yok | OWL cardinality |
| Alerjeni olan kişi risklidir | Yok | OWL restriction / SWRL |
| BMI hesabı | Yok | SWRL built-in |
| Tutarsızlık denetimi | Yok | Reasoner (HermiT) |
Hafta 04'te bu satırların tamamını OWL ile karşılayacağız.
Protégé'de göreceğiniz ekran: OntoGraf
EntitiesIndividuals by classOntoGraf
TC_001
──hasAllergy──▶
Lactose
◀──Triggers──
Nisin
TC_001
──ChooseProduct──▶
EAN_00004
──Contain──▶
Nisin
Şematik gösterim. İki satırın kapandığı yer — Nisin ve Lactose — riskin bulunduğu döngüdür.
Java + Jena: grafı okumak
Model m = ModelFactory.createDefaultModel();
m.read("ALLERGY_FIXED.owl");
String NS = "http://EMU/AllergyOntology#";
Property contain = m.getProperty(NS + "Contain");
StmtIterator it = m.listStatements(null, contain, (RDFNode) null);
while (it.hasNext()) {
Statement st = it.nextStatement();
System.out.println(st.getSubject().getLocalName() + " -> " +
st.getObject().asResource().getLocalName());
}
Jena RDF/RDFS düzeyinde çalışır. Projede OWL API kullanacağız (Hafta 08), çünkü aksiyom ve kural desteği gerekiyor.
Java + Jena: SPARQL çalıştırmak
String q = "PREFIX : <http://EMU/AllergyOntology#> "
+ "SELECT ?p ?f WHERE { "
+ " ?p :ChooseProduct ?u . ?u :Contain ?f . "
+ " ?f :Triggers ?a . ?p :hasAllergy ?a }";
try (QueryExecution qe = QueryExecutionFactory.create(q, m)) {
ResultSet rs = qe.execSelect();
while (rs.hasNext()) {
QuerySolution s = rs.next();
System.out.println(s.getResource("p").getLocalName()
+ " risk: " + s.getResource("f").getLocalName());
}
}
05
Ödev ve Proje Adımı
Kataloğunuzu RDF'e taşıyın ve sözlüğünü kurun.
Ödev 3 — Alerji grafı ve sözlüğü
- Hafta 02'deki XML'inizi Turtle'a çevirin (en az 40 üçlü).
- RDFS ile sınıf ve alt özellik hiyerarşisini kurun.
- Tüm özelliklere domain/range bildirin.
- İki dilli rdfs:label ekleyin.
- Üç SPARQL sorgusu yazın; biri zincirleme olsun.
Teslim
catalog.ttl + sorgular + RDFS çıkarımlarının elle listesi (hangi üçlü hangi kuraldan).
Çözümü Hafta 04'ün başında ele alacağız.
Değerlendirme ölçütleri
| Ölçüt | Ağırlık | Beklenen |
| Turtle doğruluğu | 25% | Ayrıştırılabilir, tipli literaller |
| Sözlük tasarımı | 30% | Hiyerarşi gerekçeli |
| domain/range | 15% | Tam ve tutarlı |
| SPARQL | 20% | Zincirleme sorgu çalışıyor |
| Çıkarım listesi | 10% | Kural eşlemesi doğru |
Kaynaklar
- W3C — RDF 1.1 Primer; RDF 1.1 Concepts and Abstract Syntax.
- W3C — RDF Schema 1.1; RDF 1.1 Turtle.
- W3C — SPARQL 1.1 Query Language.
- Allemang & Hendler — Semantic Web for the Working Ontologist, Böl. 3–7.
- Apache Jena belgeleri — Model API ve ARQ.
Özet • 1 / 2
RDF: veri modeli
- Her şey üçlüdür: özne, yüklem, nesne.
- Paylaşılan IRI'ler grafları JOIN'siz birleştirir.
- Literal tipi ihmal edilirse kurallar sessizce çalışmaz.
- SPARQL grafı sorgular; CONSTRUCT yeni üçlü üretir ama kalıcı yazmaz.
Özet • 2 / 2
RDFS ve sonraki adım
- subClassOf, subPropertyOf, domain, range: dört çıkarım kuralı.
- domain/range kısıt değil, çıkarım üretir.
- Alerjen alt özellikleri, S7 kuralını tek satıra indirir.
Hafta 04'te
OWL temelleri: sınıf, özellik, birey, aksiyom; OWL Lite / DL / Full ve ayrıklık.
Ayrıca: Ödev 3'ün ayrıntılı çözümü.
Tekrar Soruları
Kendinizi sınayın
- Literal neden özne olamaz?
- Blank node'un birleştirmedeki sakıncası nedir?
- domain bildirimi hangi üçlüyü üretir?
- Alt özellik hiyerarşisi S7 kuralını nasıl kısaltır?
- CONSTRUCT ile SWRL arasındaki temel fark nedir?
- Adlandırılmış graf hangi soruyu cevaplar?
- RDFS ile ayrıklık neden yazılamaz?
- Aynı graf iki serileştirmede farklı görünür mü? Neden?
Alıştırma • Sınıf içi
Grafı tamamlayın
Yeni kişi TC_005: 16 yaşında, gluten alerjisi var, EAN_00001 seçti.
:TC_005 a :Person ;
:hasAge ______ ;
:hasAllergy ______ ;
:ChooseProduct ______ .
Sorular
- Hangi RDFS çıkarımları üretilir?
- Risk zinciri kapanır mı? Hangi üçlü sayesinde?
- Bu kişi Adult olur mu? Neden?
Çözüm Hafta 04'te.